// what udp sends is what it recieved
module udp #(
    parameter 
            BOARD_MAC = 48'h00_11_22_33_44_55,   
            BOARD_IP = {8'd192,8'd168,8'd1,8'd10},
            BOARD_UDP_PORT_NUM = 16'd1234,
            DES_UDP_PORT_NUM = 16'd1234
)(
    input        clk                , // input 1bit clock               
    input        rst_n              , // input 1bit negedge reset                        
    input        gmii_rx_en         , // input 1bit rx enable           
    input [7:0]  gmii_rx_data       , // input 8bit rx data             
    input        udp_key_tx         , // input 1bit key pulse of tx     
    input [31:0] des_ip             ,
    input [47:0] des_mac            ,
    input        tx_start           ,
    input [7:0]  udp_fifo_rd_data   ,
    input [15:0] len_udp_data       ,
    input [15:0] rd_data_count      ,
    output       udp_fifo_rd_en     ,
    output       gmii_tx_en         , // output 1bit tx enable          
    output [7:0] gmii_tx_data       , // output 8bit tx data             
    output       udp_tx_done        , // output 1bit tx done            
    output       udp_tx_busy        , // output 1bit tx busy            
    output       udp_rx_done        ,
    output [7:0] udp_rx_data          // to ov5640 ctrl
);

wire crc_en;
wire crc_clr;
wire [31:0] crc_data;
wire [31:0] crc_next;
udp_rx#(
    .BOARD_IP(BOARD_IP),
    .BOARD_MAC(BOARD_MAC)
)u_udp_rx(
    .rst_n              (rst_n),
    .clk                (clk),
    .gmii_rx_en_i       (gmii_rx_en),
    .gmii_rx_data_i     (gmii_rx_data),

    .rx_done            (udp_rx_done),
    .udp_rx_data        (udp_rx_data)
);

udp_tx#(
    .BOARD_IP(BOARD_IP),
    .BOARD_MAC(BOARD_MAC),
    .BOARD_UDP_PORT_NUM(BOARD_UDP_PORT_NUM)
)u_udp_tx(
    .clk                (clk),
    .rst_n              (rst_n),
    .des_mac            (des_mac),
    .des_ip             (des_ip),
    .crc_data           (crc_data),
    .crc_next           (crc_next[31:24]),
    .tx_start           (tx_start),
    .udp_des_port_num   (DES_UDP_PORT_NUM),
    .udp_fifo_rd_data   (udp_fifo_rd_data),
    .rd_data_count      (rd_data_count),
    
    .gmii_tx_en         (gmii_tx_en),
    .gmii_tx_data       (gmii_tx_data),
    .tx_done            (udp_tx_done),
    .udp_tx_busy        (udp_tx_busy),
    .crc_clr            (crc_clr),
    .crc_en             (crc_en),
    .udp_fifo_rd_en     (udp_fifo_rd_en),
    .len_udp_data       (len_udp_data)
);

crc32_d8 u_udp_crc32_d8(
    .clk        (clk),
    .rst_n      (rst_n),
    .data       (gmii_tx_data),
    .crc_en     (crc_en),
    .crc_clr    (crc_clr),
    .crc_data   (crc_data),
    .crc_next   (crc_next)
);
endmodule